//导包
#include <FastLED.h>
//led灯数量
#define NUM_LEDS 14
//数据引脚
#define DATA_PIN 4

//构造RGB对象数组
CRGB leds[NUM_LEDS];

//正常状态
//CRGB blue(130,169,206);
CRGB blue(0,50,150);

//思考状态
CRGB yellow(255,255,0);

//危险状态
CRGB red(213,37,33);

int brightness=100;

int MAX_BRIGHTNESS=200;




//初始化函数
// void init(){
//       for(int i=0; i<NUM_LEDS-2; i++) {
//         leds[i]=blue;
//       }
//       leds[NUM_LEDS-2]=CRGB::Black;
//       leds[NUM_LEDS-1]=CRGB::Black;
//       FastLED.show();
// }

//初始化
void setup() { 
      FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
      //初始化亮度
      FastLED.setBrightness(brightness);
      //init();
}

void loop() { 

  blink(red,1000,true);
  //状态转换
  transTo(red,blue);
  //设置空白
  setAll(blue,true);
  leds[0]=CRGB::Black;
  FastLED.show();
  //正常显示
  nomal();
  nomal();
  nomal();
  bln_for(blue,6,2);


  //--------------
  blink(yellow,1000,true);
  //状态转换
  transTo(blue,yellow);
  //设置空白
  setAll(yellow,true);
  leds[0]=CRGB::Black;
  FastLED.show();
  //正常显示
  nomal();
  nomal();
  nomal();
  bln_for(yellow,6,2);

  //--------------
  blink(red,1000,true);
  //状态转换
  transTo(yellow,red);
  //设置空白
  setAll(red,true);
  leds[0]=CRGB::Black;
  FastLED.show();
  //正常显示
  nomal();
  nomal();
  nomal();
  bln_for(red,6,2);
}


//转换函数
void transTo(CRGB s,CRGB e){
  blink(s,50,true);
  blink(s,50,true);
  blink(s,100,true);
  blink(s,150,true);
  blink(e,120,true);
  blink(s,100,true);
  blink(e,200,true);
  blink(e,0,false);
}

//设置所有灯
void setAll(CRGB rgb,boolean show){
  for(int i=0; i<NUM_LEDS; i++) {
        leds[i]=rgb;
  }
  if(show){
    FastLED.show();
  }
}

//呼吸灯循环
void bln_for(CRGB rgb,int count,int ms){
  for(int i=0; i<count; i++) {
       bln(rgb,ms);
  }
}

//呼吸灯
void bln(CRGB rgb,int ms){
  setAll(rgb,false);
  if(brightness>=MAX_BRIGHTNESS){
    while(brightness>0) {
          FastLED.setBrightness(brightness);
          FastLED.show();
          delay(ms);
          brightness--;
    }
  }else{
    while(brightness<MAX_BRIGHTNESS) {
          FastLED.setBrightness(brightness);
          FastLED.show();
          delay(ms);
          brightness++;
    }
  }
}



//闪烁函数
void blink(CRGB rgb,int ms,boolean isShowBlack){
      for(int i=0; i<NUM_LEDS; i++) {
        leds[i]=rgb;
      }
      FastLED.setBrightness(brightness);
      FastLED.show();
      delay(ms);
      if(isShowBlack){
        for(int i=0; i<NUM_LEDS; i++) {
        leds[i]=rgb;
        }
      delay(ms/2);
      }
      FastLED.setBrightness(MAX_BRIGHTNESS);
      FastLED.show();
}



//正常 思考 
void nomal() { 
  for(int i=0; i<20; i++) {
   revolve(false,65);
  }
}

// //向前向后旋转
// void forwardAndBackwardRevolve(){
//     for(int i=0; i<3; i++) {
//       revolve(false,65);
//     }
//     for(int i=0; i<5; i++) {
//       revolve(true,65);
//     }
//     for(int i=0; i<20; i++) {
//       revolve(false,65);
//     }
// }


//旋转函数
void revolve(boolean forward,int ms){
  if(forward){
    CRGB temp=leds[NUM_LEDS-1];
    for(int i=NUM_LEDS-1; i>0; i--) {
        leds[i]=leds[i-1];
    }
    leds[0]=temp;
  }else{
    CRGB temp=leds[0];
    for(int i=0; i<NUM_LEDS-1; i++) {
        leds[i]=leds[i+1];
    }
    leds[NUM_LEDS-1]=temp;
  }
  FastLED.show();
  delay(ms);
}
